// 7-25 判断上三角矩阵 (15分)
// 上三角矩阵指主对角线以下的元素都为0的矩阵；主对角线为从矩阵的左上角至右下角的连线。

// 本题要求编写程序，判断一个给定的方阵是否上三角矩阵。

// 输入格式：
// 输入第一行给出一个正整数T，为待测矩阵的个数。接下来给出T个矩阵的信息：每个矩阵信息的第一行给出一个不超过10的正整数n。随后n行，每行给出n个整数，其间以空格分隔。

// 输出格式：
// 每个矩阵的判断结果占一行。如果输入的矩阵是上三角矩阵，输出“YES”，否则输出“NO”。

#include <stdio.h>
#include <stdlib.h>

int isUTMat(int n, int a[][10]); // UTMat = upper triangular matrix
void readMat(int n, int a[][10]);

int main()
{
    int T, n, t;
    scanf("%d", &T);
    t = T;  // t用于保存T的初始值,来帮助表示每次循环时result的下标值
    int myArray[10][10], * result = 0;
    result = (int *)malloc(T * sizeof(int));
    while (T--)
    {
        scanf("%d", &n);
        readMat(n, myArray);  // 读入矩阵
        result[t - T -1] = isUTMat(n, myArray); // 将该矩阵是否为上三角矩阵写入result数组
    }
    for (int i = 0; i < t; i++)  // 输出结果
    {
        if (result[i])
        {
            printf("YES\n");
        }
        else
        {
            printf("NO\n");
        }
    }

    return 0;
}

int isUTMat(int n, int arr[][10])  // n是矩阵维数
{
    // 是上三角矩阵return 1；反之return 0
    for (int i = 1; i < n; i++)
    {
        for (int j = 0; j < i; j++)
        {
            if (arr[i][j] != 0)
            {
                return 0;
            }
        }
    }
    return 1;
}

void readMat(int n, int arr[][10]) // n是矩阵维数
{
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            scanf("%d", &arr[i][j]);
        }
    }
}

// 输入样例：
// 2
// 3
// 1 2 3
// 0 4 5
// 0 0 6
// 2
// 1 0
// -8 2

// 输出样例：
// YES
// NO